-- Codename Radical by Basil Voronkov
-- Module 'episodes'
---------------------------------------------
-- Implements check points engine and an ability to
-- load an episode from a menu.
require "lib/core"
require "lib/const"
require "lib/mainmenu"

episodes = {
  arr = {},
  chapters = {},
  tabl = {},
  chaptery = 50,
  chapterfont = "sans-b.ttf",
  chapterfontsize = 22,
  epy = 140,
  epx = 640,
  epfontb = "sans-b.ttf",
  epfont = "sans.ttf",
  epfontsize = 14,
  chaptermap = nil,
  chaptercount = 0
}

function episodes.init()
  episodes.arr = {};
  episodes.tabl = {};
  episodes.chapters = {};
  episodes.chaptercount = 0;
  episodes.register("1-wake", "Мертвый час", "Катя просыпается среди ночи.", "1-deadhour/wake.lua", "ch1");
  episodes.register("1-walk", "Мертвый час", "Катя встречается с Колей.", "1-deadhour/walk.lua");
  episodes.register("1-med", "Мертвый час", "Катя в центре здоровья.", "1-deadhour/med.lua");
  episodes.register("1-doc", "Мертвый час", "Катя у доктора Кочевникова.", "1-deadhour/doc.lua");
  episodes.register("1-subway", "Мертвый час", "Катя возвращается домой на метро.", "1-deadhour/subway.lua");
  episodes.register("1-night", "Мертвый час", "В городе начался комендантский час.", "1-deadhour/night.lua");
  episodes.register("1-clinic", "Мертвый час", "Катя привела отца на обследование.", "1-deadhour/clinic.lua");
  episodes.register("1-tea", "Мертвый час", "Катя дома ухаживает за отцом.", "1-deadhour/tea.lua");
    
  episodes.register("2-eye", "Падение", "Неизвестная девушка спасается от Ока.", "2-eye/eye.lua", "ch2");  
  episodes.register("2-visit","Падение", "Петр на окраине города.", "2-eye/visit.lua");
  episodes.register("2-fall","Падение", "Петр на месте падения Ока.", "2-eye/fall.lua");
  episodes.register("2-car", "Падение", "Неизвестная девушка ведут к машине.", "2-eye/car.lua");
  
  episodes.register("3-clinic", "Дознание", "Катя пытается найти доктора Тихонова.", "3-inter/clinic.lua", "ch3");
  episodes.register("3-work", "Дознание", "Катя пытается узнать, где работал отец.", "3-inter/work.lua");
  episodes.register("3-inter", "Дознание", "Петр допрашивает задержанную.", "3-inter/inter.lua");
  episodes.register("3-bel", "Дознание", "Катя в строительной компании.", "3-inter/bel.lua");
  episodes.register("3-ssk", "Дознание", "Петр в офисе ССК, проводит расследование.", "3-inter/ssk.lua");
  episodes.register("3-cell", "Дознание", "Фён в заключении в ССК.", "3-inter/cell.lua");
  episodes.register("3-shadow", "Дознание", "Катя вечером одна в своей квартире.", "3-inter/shadow.lua");
  
  episodes.register("4-mad", "Режим", "Фён в больнице.", "4-mad/mad.lua");
  episodes.register("4-funeral", "Режим", "Катя на похоронах отца.", "4-mad/funeral.lua");
  episodes.register("4-face", "Режим", "Фён страдает от приступов боли.", "4-mad/face.lua");
  episodes.register("4-petr", "Режим", "Петр проводит расследование.", "4-mad/petr.lua");
  episodes.register("4-crush", "Режим", "Степанов исследует мертвый город.", "4-mad/crush.lua");
    
  sys_episodes = episodes.gallery();
end

function episodes.register(key, nam, dsc, gamefile, bg)
  if episodes.tabl[nam] == nil then
    episodes.chaptercount = episodes.chaptercount+1;
    table.insert(episodes.chapters, {nam=nam,ch=episodes.chaptercount});
    episodes.tabl[nam] = nam;
  end
  table.insert(episodes.arr, {key=key,ch=episodes.chaptercount,nam=nam,img="",dsc=dsc,gamefile=gamefile});
end

function episodes.unlock(key)
  prefs["episode_"..key] = true;
  local s = nil;
  for _,v in ipairs(episodes.arr) do
    if v.key == key then
      --sys_episodes.selchapter = v.nam;
      prefs["last_episode"] = v.gamefile;
    end
  end
end

function episodes.unlocked(key)
  return true--return prefs["episode_"..key];
end

function episodes.gallery()
  local ret = engine.gameroom {
     tile       = mainmenu.image
    ,hidemenu   = true
    ,fps        = 20
    ,build      = function(s)
                    s.arr = {};
                    s.chaptercount = 0;
                    local tmp = {};
                    for i,a in ipairs(episodes.arr) do
                      if episodes.unlocked(a.key) and tmp[a.ch] == nil then
                        table.insert(s.arr, episodes.chapters[a.ch]);
                        tmp[a.ch] = 0;
                        s.chaptercount = s.chaptercount+1;
                      end
                    end
                  end
    ,ondrawbg   = function(s,p)
                    s:build();
                    s.map = map(0, 0, const.winwidth, const.winheight);
                    s.bmap = map(0, 0, const.winwidth, const.winheight);
                    s.epmap = {};
                    drawing.draw_pic(p, const.path.ui.."next2.png", 10, 570);
                    drawing.draw_text(p, "Вернуться", 20, 570, "white", const.font, 14);
                    s.map:add("close", 10, 570, 80, drawing.text_height(const.font, 14));
                    drawing.draw_text(p, "Выбор эпизода", 60, 260, "white", const.fontb, 24);
                    
                    if s.chaptercount == 0 then
                      drawing.draw_text(p, "Не открыто ни одного эпизода.", episodes.epx, episodes.chaptery, const.textcolor, episodes.chapterfont, episodes.epfontsize);
                      return p;
                    end
                    
                    --Chapters
                    if s.selchapter == nil or s.selchapter > s.chaptercount then
                      s.selchapter = 1;
                    end
                    drawing.draw_text(p, "Глава "..tostring(s.selchapter), episodes.epx, episodes.chaptery, const.textcolor, episodes.chapterfont, episodes.epfontsize);
                    drawing.draw_text(p, s.arr[s.selchapter].nam,  episodes.epx, episodes.chaptery+18, "white", episodes.chapterfont, episodes.chapterfontsize);
                    local up,dn = "up.png","down.png";
                    if s.selchapter == 1 then
                      up = "up_dis.png";
                    end
                    if s.selchapter == s.chaptercount then
                      dn = "down_dis.png";
                    end
                    drawing.draw_pic(p, const.path.ui..up, episodes.epx, episodes.chaptery - 15);
                    drawing.draw_pic(p, const.path.ui..dn, episodes.epx, episodes.chaptery + 50);
                    s.bmap:add("up", episodes.epx, episodes.chaptery - 15, 18, 9);
                    s.bmap:add("down", episodes.epx, episodes.chaptery + 50, 18, 9);
                    
                   --Episodes
                    local y = episodes.epy;
                    local en = 0;
                    for i,a in ipairs(episodes.arr) do
                      if a.ch == s.selchapter and episodes.unlocked(a.key) then
                        en = en + 1;
                        s.epmap[a.key] = a.gamefile;
                        local sy = y;
                        drawing.draw_text(p, "Эпизод "..en, episodes.epx, y, const.textcolor, episodes.epfontb, episodes.epfontsize);
                        y = y + drawing.text_height(episodes.epfontb, episodes.epfontsize);
                        drawing.draw_text(p, a.dsc, episodes.epx, y, const.textcolor, episodes.epfont, episodes.epfontsize);
                        y = y + drawing.text_height(episodes.epfont, episodes.epfontsize) + 15;
                        s.map:add(a.key, episodes.epx, sy, drawing.text_width(a.dsc, episodes.epfont, episodes.epfontsize), y - sy - 15);
                      end
                    end
                    return p;
                  end
    ,ontimer    = function(s, x, y)
                    if s.bmap == nil then
                      return;
                    end
                    local sel = s.bmap:get(x, y);
                    if s.oldbsel ~= nil then
                      drawing.clean(s.pic, episodes.epx, s.oldbsel, 18, 9);
                      s.oldbsel = nil;
                    end
                    if sel == "up" and s.selchapter > 1 then
                      drawing.copy_pic(s.pic, const.path.ui.."up_sel.png", episodes.epx, episodes.chaptery - 35);
                      s.oldbsel = episodes.chaptery - 35;
                    elseif sel == "down" and s.selchapter < s.chaptercount then
                      drawing.copy_pic(s.pic, const.path.ui.."down_sel.png", episodes.epx, episodes.chaptery + 30);
                      s.oldbsel = episodes.chaptery + 30;
                    end
                  end
    ,onclick    = function(s, x, y)
                    local sel = s.map:get(x, y);
                    if s.epmap[sel] ~= nil then
                      gamefile(const.path.game..s.epmap[sel], true);
                    elseif sel == "close" then
                      play_sound("flash");
                      walkblack_("sys_menuroom")();
                      return;
                    elseif sel ~= nil then
                      s.selchapter = sel;
                      refresh();
                    end
                    sel = s.bmap:get(x, y);
                    if sel == "up" and s.selchapter > 1 then
                      s.selchapter = s.selchapter - 1;
                      play_sound("switch");
                      refresh();
                    elseif sel == "down" and s.selchapter < s.chaptercount then
                      s.selchapter = s.selchapter + 1;
                      play_sound("switch");
                      refresh();
                    end
                    return true;
                  end
  }
  ret.kbd       = function(s)
                    play_sound("flash");
                    walkblack_("sys_menuroom")();
                    return true;
                  end
  return ret;
end